"""
元组 tuple
不可变的列表
"""
nums = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(nums)
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# 也可以不加圆括号
nums = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
print(nums)
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

# 通过下标获取元素
print(nums[1])  # 1
print(nums[-1])  # 9

# 可以跟列表一样切片 切片实际上是某种方式复制了一份内容给新的目标

l001 = nums[::-1]
print(l001)
# (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
# nums[1] = 3  # 元组不支持项目赋值 TypeError: 'tuple' object does not support item assignment
# l001[1] = 0
# print(l001)  # 元组不支持项目赋值 TypeError: 'tuple' object does not support item assignment

# 查
print(nums.count(1))  # 1
print(nums.index(1))  # 1

# 元祖也支持列表的相关操作
x = (1, 2, 3)
y = (4, 5, 6)
# 加
z1 = x + y
print(z1)  # (1, 2, 3, 4, 5, 6)
# 嵌套高维
z2 = x, y
print(z2)  # ((1, 2, 3), (4, 5, 6))
# * 运算
z3 = x * 3
print(z3)  # (1, 2, 3, 1, 2, 3, 1, 2, 3)
# 迭代
for val in z1:
    print(val, end=" ")
else:
    print()
    # 1 2 3 4 5 6

# 高维迭代
for a in z2:
    for b in a:
        print(b, end=" ")
    print()
    # 1 2 3
    # 4 5 6
# 列表推导式
a = [i * j
     for i in x
     for j in y
     ]
print(a)
#  [4, 5, 6, 8, 10, 12, 12, 15, 18]
# 不存在元组推导式 元组推导式的形式实际上是 生成器

# 圆括号的必要性？ 在没有发生歧义的情况下可以不加 为了代码的可读性方便维护最好加上

# 生成一个元素的元组
# 这样生成的是一个int
# y = (2)
# print(type(y))<class 'int'>

# 我们要这样
x = (2,)
print(type(x))  # <class 'tuple'>

# 打包与解包 (同样对序列类型适用 如字符串)
# 注意！ = 左边的变量数量一定要与右边一致或使用*通配否则报错
# 打包
t = (123, 'bjz', 3.1415)
# 解包
i, j, k = t
print(i)  # 123
print(j)  # bjz
print(k)  # 3.1415

# y, y = 10, 20 就是通过元组进行赋值的

# 虽然元组不可变 但是元组内的元素指向一个列表等的地址值的时候就可以修改！
x = [1, 2, 3]
y = [4, 5, 6]

z = (x, y)
print(z)  # ([1, 2, 3], [4, 5, 6])
z[0][0] = 10
print(z)  # ([10, 2, 3], [4, 5, 6])
